package com.my.hzb.common.util;

import java.security.Key;
import java.security.SecureRandom;
import java.security.spec.AlgorithmParameterSpec;
import javax.crypto.Cipher;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import javax.crypto.spec.IvParameterSpec;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class DesUtil {

	public static final String ALGORITHM_DES = "DES/CBC/PKCS5Padding";
    private static Log log = LogFactory.getLog(DesUtil.class);
    /**
     * DES算法，加密
     *
     * @param data 待加密字符串
     * @param key  加密私钥，长度不能够小于8位
     * @return 加密后的字节数组，一般结合Base64编码使用
     * @throws CryptException 异常
     */
    public static String encode(String key,String data) throws Exception
    {
        return encode(key, data.getBytes());
    }
    /**
     * DES算法，加密
     *
     * @param data 待加密字符串
     * @param key  加密私钥，长度不能够小于8位
     * @return 加密后的字节数组，一般结合Base64编码使用
     * @throws CryptException 异常
     */
    public static String encode(String key,byte[] data){
        try
        {
	      DESKeySpec dks = new DESKeySpec(key.getBytes());
	
	      SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
          //key的长度不能够小于8位字节
          Key secretKey = keyFactory.generateSecret(dks);
          Cipher cipher = Cipher.getInstance(ALGORITHM_DES);
          IvParameterSpec iv = new IvParameterSpec("********".getBytes());
          AlgorithmParameterSpec paramSpec = iv;
          cipher.init(Cipher.ENCRYPT_MODE, secretKey,paramSpec);

          byte[] bytes = cipher.doFinal(data);
          return CommonUtil.base64encode(new String(bytes));
        } catch (Exception e){
            e.printStackTrace();
        }
        return null;
    }
    /**
     * DES算法，解密
     *
     * @param data 待解密字符串
     * @param key  解密私钥，长度不能够小于8位
     * @return 解密后的字节数组
     * @throws Exception 异常
     */
    public static byte[] decode(String key,byte[] data){
        try{
           SecureRandom sr = new SecureRandom();
	       DESKeySpec dks = new DESKeySpec(key.getBytes());
	       SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
            //key的长度不能够小于8位字节
            Key secretKey = keyFactory.generateSecret(dks);
            Cipher cipher = Cipher.getInstance(ALGORITHM_DES);
            IvParameterSpec iv = new IvParameterSpec("********".getBytes());
            AlgorithmParameterSpec paramSpec = iv;
            cipher.init(Cipher.DECRYPT_MODE, secretKey,paramSpec);
            return cipher.doFinal(data);
        } catch (Exception e){
            e.printStackTrace();
        }
		return null;
    }

    /**
     * 解密获取编码后的值
     * @param key
     * @param data
     * @return
     * @throws Exception 
     * @throws Exception
     */
    public static String decodeValue(String key,String data) throws Exception 
    {
      byte[] datas;
      String value = null;
      datas = decode(key, CommonUtil.base64decode(data).getBytes());
	  value = new String(datas);
	  if (value.equals("")){
	   throw new Exception();
	  }
     return value;
    }
    
    public static void main(String[] args) throws Exception {
    	String key = "12345678";
    	String vv = "wegwegwe4567890okiutr5er4()_+";
    	String en = encode(key,vv);
    	System.out.println(en);
    	System.out.println(decodeValue(key, en));
	}
}
